package br.com.rookgraph.run;

import java.util.Random;
import java.util.Scanner;

import br.com.rookgraph.GenerateGraph;
import br.com.rookgraph.Graph;
import br.com.rookgraph.utils.BranchReduceDepurator;
import br.com.rookgraph.utils.BranchReduceExecute;

public class RunBranchGeneratorPlus {

	public static void main(String[] args) {
		int pior = 0;
		int melhor = 0;

		int qtdBranchNormal = -1; int  qtdBranchAlterado = -1;

		Scanner s = new Scanner(System.in);

		System.out.println("COMPARAÇÃO DA HEURÍSTICA ORIGINAL COM SEGUNDA HEURISTICA - MODO NÃO ESTANQUE PLUS2 ");
		
		
		System.out.println("Digite o número de vertices para cada grafo: ");
		int numV	= s.nextInt();


		System.out.println("Digite a Probabilidade de incidência de arestas (0-99): ");
		int incEdge = s.nextInt();

		System.out.println( "\n *****  Resultado *****");
		System.out.println( "Grafo  Normal  Alterado");
		int i = 1;

		while (qtdBranchNormal >= qtdBranchAlterado) {
			GenerateGraph generateGraph = new GenerateGraph();
			Graph graph = generateGraph.generateWhit(numV, incEdge);
			int qtdBranchTreeInicial = 0;

			int raiz = new Random().nextInt(numV)+1;
			Graph treeIni = graph.getTreeLarge(new Graph(graph.getOrder()), raiz);
			qtdBranchTreeInicial = treeIni.getBranchs().length;

			if (qtdBranchTreeInicial > 0) {
								
				// Para rodar com a heuristica Normal
				Graph resultIr = BranchReduceExecute.normal(graph, clone(treeIni));

				// Para rodar com a heuristica Plus Normal
//				Graph result = BranchReduceExecute.plus(graph, clone(treeIni));
				

				// para ver o grafo e árvore quando tem loop				
/*				System.out.println("\n GRAFO ORIGINAL \n");
				graph.showMatix();

				System.out.println("\n\n ARVORE INICIAL \n");
   				treeIni.showMatix();
*/
										
				// Para rodar com a heuristica Plus Alterada
				Graph result = BranchReduceExecute.plus2(graph, clone(treeIni));

		
				qtdBranchNormal = resultIr.getBranchs().length;
				qtdBranchAlterado = result.getBranchs().length;

// esse if é para exibir e contabilizar somente quando foi possível fazer a redução de branches em pelo menos uma heuristica
			if (qtdBranchTreeInicial > qtdBranchNormal || qtdBranchTreeInicial > qtdBranchAlterado){	
				
				if (qtdBranchNormal > qtdBranchAlterado) {
					++melhor;
				}
				else{
					if (qtdBranchNormal < qtdBranchAlterado) {
						++pior;
					}
				}
				showResult(result,resultIr,i);
				++i;
			}
				if (qtdBranchNormal < qtdBranchAlterado){

					System.out.println("\n\nMelhores Resultado com IR NORMAL   ==> "+pior);
					System.out.println("Melhores Resultado com IR ALTERADO ==> "+melhor);

					System.out.println("\n\n\n ############ Depuracao com a Heuristica Normal #############\n");
					BranchReduceDepurator.normal(graph, clone(treeIni));

					// Depuracao com a Heuristica Plus 
				//	System.out.println("\n\n\n ############ Depuração com Heuristica Plus ############\n");
				//	BranchReduceDepurator.plus(graph, clone(treeIni));
					
					// Depuracao com a Heuristica Plus Alterada
					System.out.println("\n\n\n ############ Depuração com Segunda Heuristica Plus Alterada ############\n");
					BranchReduceDepurator.plus2(graph, clone(treeIni));
					
				}
			}
		}
	}


	/**
	 * Retorna um clone do grafo passado, uma nova instancia
	 * com a mesma matriz de adjacencia.
	 *
	 * @param treeLarge
	 * @return clone da tree
	 */
	public static Graph clone(Graph graph){
		try {
			return (Graph) graph.clone();
		} catch (CloneNotSupportedException e) {
			throw new RuntimeException(e);
		}
	}


	private static void showResult(Graph result, Graph resultIr, int j) {
		int qtdBranchNormal, qtdBranchAlterado;

		qtdBranchNormal = resultIr.getBranchs().length;
		qtdBranchAlterado = result.getBranchs().length;

		if (qtdBranchNormal != qtdBranchAlterado) {
			System.out.println("* "+j +"      "+qtdBranchNormal+"        "+qtdBranchAlterado);
		}
		else {
			System.out.println("  "+j +"      "+qtdBranchNormal+"        "+qtdBranchAlterado);
		}
	}
}


